﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using DevComponents.DotNetBar;
using BLL;
using Entities;
using Entities.IRepository;
using DAL;

namespace HeThongNhaSach
{
    public partial class ThemHD : DevComponents.DotNetBar.Office2007Form
    {
        public frmMain frmChinh = new frmMain();
        GeneralRepository<HoaDon> _HDRepo;
        QLHoaDon _HDManager;
        List<CTHoaDon> lhd;
        GeneralRepository<CTHoaDon> _CTHDRepo;
        SachBaoRepository _SBRepo;
        QLSachBao _SBManager;
        GeneralRepository<NhanVien> _NVRepo;

        public ThemHD()
        {
            InitializeComponent();
        }

        private void ThemHD_Load(object sender, EventArgs e)
        {
            _HDRepo = new GeneralRepository<HoaDon>();
            _HDManager = new QLHoaDon(_HDRepo);
            lhd = new List<CTHoaDon>();
            _CTHDRepo = new GeneralRepository<CTHoaDon>();
            _SBRepo = new SachBaoRepository();
            _SBManager = new QLSachBao(_SBRepo);
            List<SachBao> lsb = _SBRepo.LayTatCa().ToList();
            foreach (SachBao sb in lsb)
            {
                cbbMaSB.Items.Add(sb.MaSachBao);
            }
            _NVRepo = new GeneralRepository<NhanVien>();
            try
            {
                toolStripStatusLabel2.Text = _NVRepo.GetAll().ToList().Find(delegate(NhanVien nv)
                {
                    return nv.Username == frmChinh.user;
                }).MaNhanVien;
            }
            catch
            {
                toolStripStatusLabel2.Text = "";
            }
            toolStripStatusLabel4.Text = DateTime.Now.Day + "/" + DateTime.Now.Month + "/" + DateTime.Now.Year;

        }

            public void RefreshCTHD()
            {
                dgvChiTiet.DataSource = new List<CTHoaDon>();
                dgvChiTiet.DataSource = lhd;
            }

        /// <summary>
        /// Thêm chi tiết hóa đơn
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
            private void btnThemCT_Click(object sender, EventArgs e)
            {
                CTHoaDon ct = new CTHoaDon();
                ct.MaHoaDon = TaoMaHD(DateTime.Now);
                ct.MaSachBao = cbbMaSB.Text;
                try
                {
                    ct.SoLuong = int.Parse(txtSoLuong.Text);
                }
                catch
                {
                    MessageBox.Show("Nhập lại số lượng");
                    return;
                }
                SachBao s = _SBRepo.LayTatCa().Find(delegate(SachBao sb)
                {
                    return sb.MaSachBao == ct.MaSachBao;
                });
                ct.TenSachBao = s.TenSachBao;
                ct.DonGia = s.GiaBan;
                CTHoaDon ht = lhd.Find(delegate(CTHoaDon c)
                {
                    return c.MaSachBao == ct.MaSachBao;
                });
                if (ht != null)
                {
                    if (ht.SoLuong + ct.SoLuong > s.SoLuong)
                    {
                        MessageBox.Show("Không đủ số lượng sách");
                        return;
                    }
                    ht.SoLuong += ct.SoLuong;
                }
                else
                {
                    if (ct.SoLuong > s.SoLuong)
                    {
                        MessageBox.Show("Không đủ số lượng sách");
                        return;
                    }
                    lhd.Add(ct);
                }
                RefreshCTHD();
            }
        /// <summary>
        /// Tạo mã hóa đơn theo ngày
        /// lấy ngày+tháng+2 số cuối của năm+4 số 0+stt
        /// </summary>
        /// <param name="ngay"></param>
        /// <returns></returns>
        private string TaoMaHD(DateTime ngay)
         {
            List<HoaDon> l = _HDRepo.GetAll().ToList().FindAll(delegate(HoaDon hd)
            {
                return hd.NgayLap.Date == DateTime.Now.Date;
            });
            int stt = 0;
            if (l.Count > 0)
            {
                stt = int.Parse(l[0].MaHoaDon.Substring(6, 2));
                foreach (HoaDon hd in l)
                {
                    int ma = int.Parse(hd.MaHoaDon.Substring(6, 4));
                    if (ma > stt)
                        stt = ma;
                }
            }
            return ngay.Day.ToString().PadLeft(2, '0') + ngay.Month.ToString().PadLeft(2, '0') + ngay.Year.ToString().Substring(2, 2) + (stt + 1).ToString().PadLeft(4, '0');
         }
        
        

        private void btnThoat_Click(object sender, EventArgs e)
        {
            this.Close();
        }
        /// <summary>
        /// xóa chi tiết hóa đơn
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btnXoaCT_Click(object sender, EventArgs e)
        {

            int j = 0;
            for (int i = 0; i < dgvChiTiet.Rows.Count; i++)
            {
                if (dgvChiTiet.Rows[i].Selected && lhd.Count >= i)
                {
                    lhd.RemoveAt(j);
                    j--;
                }
                j++;
            }
            RefreshCTHD();
        }
        /// <summary>
        /// Tính tổng tiền bán sách
        /// </summary>
        /// <returns></returns>
        public float TinhTien()
        {
            float kq = 0;
            foreach (CTHoaDon ct in lhd)
            {
                SachBao s = _SBRepo.LayTatCa().Find(delegate(SachBao sb)
                {
                    return sb.MaSachBao == ct.MaSachBao;
                });
                kq += ct.SoLuong * s.GiaBan;
            }
            return kq;
        }
        /// <summary>
        /// Thêm hóa đơn
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btnThemHD_Click(object sender, EventArgs e)
        {
            if (lhd.Count > 0)
            {
                HoaDon hd = new HoaDon();
                hd.MaHoaDon = TaoMaHD(DateTime.Now.Date);
                hd.MaNhanVien = toolStripStatusLabel2.Text;
                if (hd.MaNhanVien == "")
                    hd.MaNhanVien = null;
                hd.NgayLap = DateTime.Now;
                hd.ThanhTien = TinhTien();
                foreach (CTHoaDon ct in lhd)
                {
                    ct.MaHoaDon = hd.MaHoaDon;
                    SachBao s = _SBRepo.LayTatCa().Find(delegate(SachBao sb)
                    {
                        return sb.MaSachBao == ct.MaSachBao;
                    });
                    s.SoLuong -= ct.SoLuong;
                    if (s.SoLuong < 0)
                    {
                        MessageBox.Show("Mã sách báo: " + ct.MaSachBao + " không đủ số lượng");
                        return;
                    }
                }
                var vResult = _HDManager.Validate(hd);
                if (vResult.Valid)
                {
                    var aResult = _HDManager.Insert(hd);
                    if (aResult.Success)
                    {
                        foreach (CTHoaDon ct in lhd)
                        {
                            ct.MaHoaDon = hd.MaHoaDon;
                            SachBao s = _SBRepo.LayTatCa().Find(delegate(SachBao sb)
                            {
                                return sb.MaSachBao == ct.MaSachBao;
                            });
                            s.SoLuong -= ct.SoLuong;
                            if (s.SoLuong < 0)
                            {
                                MessageBox.Show("Mã sách báo: " + ct.MaSachBao + " không đủ số lượng");
                                _HDRepo.Delete(hd);
                                break;
                            }
                            else
                            {
                                _CTHDRepo.Insert(ct);
                                if (s is Sach)
                                    _SBManager.SuaThongTinSach(s as Sach);
                                if (s is Bao)
                                    _SBManager.SuaThongTinBao(s as Bao);
                                if (s is TapChi)
                                    _SBManager.SuaThongTinTapChi(s as TapChi);
                                frmChinh.tabControl1.SelectedTab = frmChinh.tabHD;
                                frmChinh.RefreshHD();
                                this.Close();
                            }
                        }
                    }
                    else
                        MessageBox.Show(aResult.GetErrorMessages());
                }
                else MessageBox.Show(vResult.ToString());
            }
            else
            {
                MessageBox.Show("Nhập sách báo khách hàng cần mua");
            }
        }

      
    }
}
        
        
            
